/*
 * 人员权限检查任务显示驱动程序 - 为工作流活动实现显示和编辑逻辑
 * 
 * 主要功能：
 * - 为ManagePersonsPermissionCheckerTask实现显示和编辑逻辑
 * - 在活动对象和视图模型之间进行数据映射
 * - 支持工作流活动的配置界面
 * - 提供工作流活动的可视化编辑
 */

using Lombiq.TrainingDemo.Activities;
using Lombiq.TrainingDemo.ViewModels;
using OrchardCore.Workflows.Display;
using OrchardCore.Workflows.Models;

namespace Lombiq.TrainingDemo.Drivers;

/// <summary>
/// 人员权限检查任务显示驱动程序 - 为工作流活动实现显示和编辑逻辑
/// 
/// 主要用途：
/// - 为ManagePersonsPermissionCheckerTask实现显示和编辑逻辑
 /* - 在活动对象和视图模型之间进行数据映射
 * - 支持工作流活动的配置界面
 * - 提供工作流活动的可视化编辑
 * 
 * 使用场景：
 * - 在工作流设计器中配置权限检查活动
 * - 编辑活动参数（如用户名）
 * - 显示活动的设计视图和缩略图
 * - 提供活动的可视化表示
 * 
 * 设计原因：
 * - 为工作流活动提供统一的编辑界面
 * - 实现活动对象和视图模型之间的数据转换
 * - 支持工作流活动的可视化配置
 * - 提供可重用的活动编辑组件
 * 
 * 设计模式：
 * - 驱动模式：继承ActivityDisplayDriver实现活动逻辑
 * - 映射模式：在活动对象和视图模型之间进行数据映射
 * - 泛型模式：使用泛型参数指定活动类型和视图模型类型
 * - 表达式模式：使用WorkflowExpression处理动态表达式
/// </summary>
// ActivityDisplayDriver专门用于实现工作流任务。它执行ManagePersonsPermissionCheckerTask和
// ManagePersonsPermissionCheckerTaskViewModel之间的简单映射，反之亦然。不要忘记在服务提供程序中注册此类（请参阅：Startup.cs）。
 */
public sealed class ManagePersonsPermissionCheckerTaskDisplayDriver :
    ActivityDisplayDriver<ManagePersonsPermissionCheckerTask,
    ManagePersonsPermissionCheckerTaskViewModel>
{
    /// <summary>
    /// 编辑活动方法 - 将活动数据映射到视图模型
    /// 
    /// 功能说明：
    /// - 从活动对象中提取数据
    /// - 将数据映射到视图模型
    /// - 支持工作流表达式的处理
    /// 
    /// 映射逻辑：
    /// - 将活动的UserName表达式映射到视图模型的UserName属性
    /// - 使用Expression属性获取表达式的字符串表示
    /// </summary>
    /// <param name="activity">要编辑的活动对象</param>
    /// <param name="model">目标视图模型</param>
    protected override void EditActivity(
        ManagePersonsPermissionCheckerTask activity,
        ManagePersonsPermissionCheckerTaskViewModel model) =>
        model.UserName = activity.UserName.Expression;

    /// <summary>
    /// 更新活动方法 - 将视图模型数据映射回活动对象
    /// 
    /// 功能说明：
    /// - 从视图模型中提取数据
    /// - 将数据映射回活动对象
    /// - 创建新的工作流表达式
    /// 
    /// 映射逻辑：
    /// - 将视图模型的UserName属性映射到活动的UserName属性
    /// - 创建新的WorkflowExpression<string>对象
    /// - 保持工作流表达式的完整性
    /// </summary>
    /// <param name="model">源视图模型</param>
    /// <param name="activity">要更新的活动对象</param>
    protected override void UpdateActivity(
        ManagePersonsPermissionCheckerTaskViewModel model,
        ManagePersonsPermissionCheckerTask activity) =>
        activity.UserName = new WorkflowExpression<string>(model.UserName);
}

/// <summary>
/// 工作流活动开发说明
/// 
/// 相关文件：
/// - Views/Items/ManagePersonsPermissionCheckerTask.Fields.Edit.cshtml - 编辑视图
/// - ManagePersonsPermissionCheckerTask.Fields.Design.cshtml - 设计视图
/// - ManagePersonsPermissionCheckerTask.Fields.Thumbnail.cshtml - 缩略图视图
/// 
/// 示例工作流：
/// - 位置：Recipes/TrainingDemo.Workflows.Sample.recipe.json
/// - 导入：在TrainingDemo.recipe.json文件中使用recipe步骤导入
/// 
/// 训练结束：
/// - 这是训练的结束
 //* - 如有问题，请联系GitHub或发送邮件至crew@lombiq.com
 //* - 如需更多Orchard Core开发培训，请随时联系我们
/// </summary>
// 下一站：查看以下文件以了解我们如何在管理界面上使活动可见，然后回到这里。
// Views/Items/ManagePersonsPermissionCheckerTask.Fields.Edit.cshtml,
// ManagePersonsPermissionCheckerTask.Fields.Design.cshtml, ManagePersonsPermissionCheckerTask.Fields.Thumbnail.cshtml

// 我们为实现的活动创建了一个简单的工作流来演示它是如何工作的。它可以在
// Recipes/TrainingDemo.Workflows.Sample.recipe.json下找到，您也可以看到如何使用
// TrainingDemo.recipe.json文件中的recipe步骤将其导入到设置recipe中。

// 训练部分结束：工作流

// 这是训练的结束。说再见总是很难，所以...不要这样做。让我们知道您对这个模块或Orchard Core本身的想法，
// 在GitHub上（https://github.com/Lombiq/Orchard-Training-Demo-Module）或发送邮件至crew@lombiq.com。
// 如果您觉得需要更多关于开发Orchard Core Web应用程序的培训，请随时联系我们！
